package array;

import java.util.HashSet;
import java.util.Set;

/**
 * 给你两个数组：instructions 和 values，数组的长度均为 n。
 * <p>
 * 你需要根据以下规则模拟一个过程：
 * <p>
 * 从下标 i = 0 的第一个指令开始，初始得分为 0。
 * 如果 instructions[i] 是 "add"：
 * 将 values[i] 加到你的得分中。
 * 移动到下一个指令 (i + 1)。
 * 如果 instructions[i] 是 "jump"：
 * 移动到下标为 (i + values[i]) 的指令，但不修改你的得分。
 * 当以下任一情况发生时，过程会终止：
 * <p>
 * 越界（即 i < 0 或 i >= n），或
 * 尝试再次执行已经执行过的指令。被重复访问的指令不会再次执行。
 * 返回过程结束时的得分。
 * <p>
 * 示例 1：
 * 输入： instructions = ["jump","add","add","jump","add","jump"], values = [2,1,3,1,-2,-3]
 * 输出： 1
 * 解释：
 * 从下标 0 开始模拟过程：
 * 下标 0：指令是 "jump"，移动到下标 0 + 2 = 2。
 * 下标 2：指令是 "add"，将 values[2] = 3 加到得分中，移动到下标 3。得分变为 3。
 * 下标 3：指令是 "jump"，移动到下标 3 + 1 = 4。
 * 下标 4：指令是 "add"，将 values[4] = -2 加到得分中，移动到下标 5。得分变为 1。
 * 下标 5：指令是 "jump"，移动到下标 5 + (-3) = 2。
 * 下标 2：已经访问过。过程结束。
 * <p>
 * 示例 2：
 * 输入： instructions = ["jump","add","add"], values = [3,1,1]
 * 输出： 0
 * 解释：
 * 从下标 0 开始模拟过程：
 * 下标 0：指令是 "jump"，移动到下标 0 + 3 = 3。
 * 下标 3：越界。过程结束。
 * <p>
 * 示例 3：
 * 输入： instructions = ["jump"], values = [0]
 * 输出： 0
 * 解释：
 * 从下标 0 开始模拟过程：
 * 下标 0：指令是 "jump"，移动到下标 0 + 0 = 0。
 * 下标 0：已经访问过。过程结束。
 *
 * @author Jisheng Huang
 * @version 20250420
 */
public class CalcScore_100549 {
    /**
     * @param instructions the given instruction arr
     * @param values       the given value array
     * @return
     */
    public static long calculateScore(String[] instructions, int[] values) {
        int n = instructions.length;
        Set<Integer> visited = new HashSet<>();
        int i = 0;
        long score = 0;

        while (i >= 0 && i < n && !visited.contains(i)) {
            visited.add(i);
            String instr = instructions[i];
            int val = values[i];

            if (instr.equals("add")) {
                score += val;
                ++i;
            } else if (instr.equals("jump")) {
                i += val;
            }
        }

        return score;
    }

    public static void main(String[] args) {
        String[] instructions = {"jump", "add", "add", "jump", "add", "jump"};
        int[] values = {2, 1, 3, 1, -2, -3};
        System.out.println(calculateScore(instructions, values));

        instructions = new String[]{"jump", "add", "add"};
        values = new int[]{3, 1, 1};
        System.out.println(calculateScore(instructions, values));
    }
}